International aid may take the form of multilateral aid – provided through international bodies such as the UN, or NGOs such as Oxfam – or bilateral aid, which operates on a government-to-government basis. There is considerable debate about whether international aid works, in the sense of reducing poverty and stimulating development.

However, the effectiveness of aid is often diluted by corruption. Aid is invariably channeled through the governments of recipient countries, in which power is often concentrated in the hands of a few politicians and bureaucrats, and the mechanisms of accountability are, at best, poorly developed. This tends to benefit corrupt leaders and elites rather than the people, projects and programs for which it was intended.

The hypothesis that foreign aid can promote growth in developing countries was explored, using panel data series for foreign aid, while accounting for regional differences in Asian, African, Latin American, and the Caribbean countries as well as the differences in income levels, the results of this study also indicate that foreign aid has mixed effects on economic growth in developing countries.

This study examines the relationships between foreign aid, institutional structure, and economic performance for 80 countries in Europe, America, Africa, and Asia. It is found that official development assistance and the quality of institutional structure in the sample countries affect economic growth positively.

Cargando Librerias

Algunas librerias y paquetes usados para obtener y descargar los datos

library(tidyverse) # manejo de dataframes
── Attaching core tidyverse packages ───────────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     ── Conflicts ─────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(WDI)       # libreria para acceder a metadata de banco mundial
library(readxl)    # leer archivos de excel
library(readr)     # leer archivos csv
library(visdat)    # visualizacion de datos como graficos
library(plotly)    # graficos
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Adjuntando el paquete: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
library(purrr)     # funcion map
library(plm)       # modelos lineales para datos panel

Adjuntando el paquete: ‘plm’

The following objects are masked from ‘package:dplyr’:

    between, lag, lead

Obtener datos

Datos para paises bajos ingresos sean utilizados, segun clasificación del banco mundial, hay 26 paises de bajos ingresos y 51 de ingresos medios bajos

country_class <- read_excel("CLASS.xlsx")

country_class %>%
  filter(!is.na(Region), !is.na(`Income group`)) %>%
  group_by(`Income group`) %>%
  summarise(countries = n()) %>%
  arrange(factor(`Income group`, levels = c('High income', 'Upper middle income', 'Lower middle income', 'Low income')))

Listado de paises a analisar:

my_countries <- country_class %>%
  filter(!is.na(Region), `Income group` %in% c('Low income', 'Lower middle income')) %>%
  select(Code)
my_countries

Hacer la respectiva asociacion de nombres iso3c e iso2c

my_countries$iso2c <- WDI_data$country %>%
  filter(iso3c %in% my_countries$Code) %>%
  .$iso2c
my_countries

Datos del banco mundial (para ODA y los indices de gobernanza) y el Human Development Reports API son descargados desde scripts de Python. Son almacenados en archivos CSV y luego son cargados aqui:

HDI

datos_HDI <- read_csv("datos_python_HDI.csv", col_names = c('Code', 'iso2c', 'indicator', 'year', 'value'), 
                      col_types = list(col_character(), col_character(), col_character(), col_double(), col_double()))

hdi_indicators <- datos_HDI %>% distinct(indicator) %>% .$indicator

ODA, GDP, POP.GROW

oda_indicators <- c(
'DT_ODA_ALLD_CD',
'DT_ODA_ALLD_KD',
'DT_ODA_OATL_CD',
'DT_ODA_OATL_KD',
'DT_ODA_ODAT_CD',
'DT_ODA_ODAT_GI_ZS',
'DT_ODA_ODAT_GN_ZS',
'DT_ODA_ODAT_KD',
'DT_ODA_ODAT_MP_ZS',
'DT_ODA_ODAT_PC_ZS',
'DT_ODA_ODAT_XP_ZS'
)
gob_indicators <- c(
'CC_EST',
'CC_NO_SRC',
'CC_PER_RNK',
'CC_PER_RNK_LOWER',
'CC_PER_RNK_UPPER',
'CC_STD_ERR',
'GE_EST',
'GE_NO_SRC',
'GE_PER_RNK',
'GE_PER_RNK_LOWER',
'GE_PER_RNK_UPPER',
'GE_STD_ERR',
'PV_EST',
'PV_NO_SRC',
'PV_PER_RNK',
'PV_PER_RNK_LOWER',
'PV_PER_RNK_UPPER',
'PV_STD_ERR',
'RQ_EST',
'RQ_NO_SRC',
'RQ_PER_RNK',
'RQ_PER_RNK_LOWER',
'RQ_PER_RNK_UPPER',
'RQ_STD_ERR',
'RL_EST',
'RL_NO_SRC',
'RL_PER_RNK',
'RL_PER_RNK_LOWER',
'RL_PER_RNK_UPPER',
'RL_STD_ERR',
'VA_EST',
'VA_NO_SRC',
'VA_PER_RNK',
'VA_PER_RNK_LOWER',
'VA_PER_RNK_UPPER',
'VA_STD_ERR'
)
gdp_indicators <- c(
'NY_ADJ_NNTY_PC_CD',
'NY_ADJ_NNTY_PC_KD',
'NY_ADJ_NNTY_PC_KD_ZG',
'NY_GDP_PCAP_CN',
'NY_GDP_PCAP_KN',
'NY_GDP_PCAP_CD',
'NY_GDP_PCAP_KD',
'NY_GDP_MKTP_KD_ZG',
'NY_GDP_DEFL_ZS_AD',
'NY_GDP_DEFL_ZS',
'NY_GDP_MKTP_CD',
'NY_GDP_MKTP_CN',
'NY_GDP_MKTP_KN',
'NY_GDP_MKTP_KD',
'NY_GDP_PCAP_KD_ZG',
'NY_GDP_PCAP_PP_KD',
'NY_GDP_PCAP_PP_CD',
'SL_GDP_PCAP_EM_KD',
'SP_POP_GROW'
)

datos_WB <- data.frame(indicator = character(), iso2c = character(), year = double(), value = double())

suppressWarnings(
  for (indicator in c(oda_indicators, gob_indicators, gdp_indicators)) {
    datos_WB <- rbind(datos_WB, read_csv(paste("datos_python", indicator, ".csv", sep =''), 
                                           col_names = c('indicator', 'iso2c', 'year', 'value'),
                                           col_types = list(col_character(), col_character(), col_double(), col_double())))
  }
)

Manipulacion de Datos

Transformar la estructura de los datos para una mejor comprension

datos_paper <- rbind(datos_WB, datos_HDI %>% select(indicator, iso2c, year, value)) %>%
  pivot_wider(names_from = indicator, values_from = value)

Revisar que datos estan como faltantes

ODA

vis_dat(datos_paper %>% select(all_of(gsub("_", ".", oda_indicators)))) 

  # DT.ODA.OATL.CD and DT.ODA.OATL.KD faltan
  # DT.ODA.ODAT.GI.ZS, DT.ODA.ODAT.GN.ZS, DT.ODA.ODAT.MP.ZS and DT.ODA.ODAT.XP.ZS tienen faltas
  # Un par de ocurrencias pais-año que faltan datos

GDP

vis_dat(datos_paper %>% select(NY.GDP.PCAP.CN, NY.GDP.PCAP.CD)) 

  # NY.GDP.PCAP.CN, NY.GDP.PCAP.CD, NY.GDP.MKTP.CD, NY.GDP.MKTP.CN son buenos candidatos para usar como variables, 
  # 'SY'falta PIB per Capita en 2022, 2023 sin datos algunos paises

GOV

vis_dat(datos_paper %>% arrange(year) %>% select(all_of(gsub("_", ".", gob_indicators)))) 

  # Datos del 2000 para atras tienen espacios faltantes 

HDI

vis_dat(datos_paper %>% select(all_of(hdi_indicators))) 

  # abr, co2_prod, le, le_f, le_m, mmr son las pocas categorias sin datos faltantes
  # hdi faltante en multiples ocaciones

POP.GROW

vis_dat(datos_paper %>% arrange(iso2c) %>% select(SP.POP.GROW)) 

  # ZW no tiene datos de crecimiento poblacional

Tomando en cuenta los datos faltantes, hacer filtros para seleccionar una muestra mas pequeña

2001 - 2022

vis_dat(datos_paper %>% 
        filter(!iso2c %in% c('SS', 'ZW', 'BT', 'ER', 'GW', 'KP', 'LB', 'NG', 'PS', 'SO', 'VU', 'FM', 'KI', 'TL', 'CV', 'SB','SY'),
               !year %in% c(1995, 1996, 1997, 1998, 1999, 2000, 2023)) %>%
        select(iso2c, year, hdi, DT.ODA.ALLD.CD, DT.ODA.ALLD.KD, DT.ODA.ODAT.CD, DT.ODA.ODAT.KD, DT.ODA.ODAT.PC.ZS, 
               NY.GDP.PCAP.CN, NY.GDP.PCAP.CD, SP.POP.GROW, all_of(gsub("_", ".", gob_indicators)), 
               ))

2002 - 2002

vis_dat(datos_paper %>% 
        filter(!iso2c %in% c('SS', 'ZW', 'BT', 'ER', 'GW', 'KP', 'LB', 'NG', 'PS', 'SO', 'VU', 'FM', 'KI', 'TL', 'CV', 'SB','SY'),
               !year %in% c(1995, 1996, 1997, 1998, 1999, 2000, 2001, 2023)) %>%
        select(iso2c, year, hdi, DT.ODA.ALLD.CD, DT.ODA.ALLD.KD, DT.ODA.ODAT.CD, DT.ODA.ODAT.KD, DT.ODA.ODAT.PC.ZS, 
               NY.GDP.PCAP.CN, NY.GDP.PCAP.CD, SP.POP.GROW, all_of(gsub("_", ".", gob_indicators)), 
               ))

De 2232 observaciones reducimos a 1260 (2002 hasta 2022) o a 1320 (2001 hasta 2022)

Aplicar Operador diferencia

datos_model <- datos_paper %>% 
        filter(!iso2c %in% c('SS', 'ZW', 'BT', 'ER', 'GW', 'KP', 'LB', 'NG', 'PS', 'SO', 'VU', 'FM', 'KI', 'TL', 'CV', 'SB', 'SY'),
               !year %in% c(1995, 1996, 1997, 1998, 1999, 2000, 2023)) %>%
        select(iso2c, year, hdi, DT.ODA.ALLD.CD, DT.ODA.ALLD.KD, DT.ODA.ODAT.CD, DT.ODA.ODAT.KD, DT.ODA.ODAT.PC.ZS, 
               NY.GDP.PCAP.CN, NY.GDP.PCAP.CD, SP.POP.GROW, all_of(gsub("_", ".", gob_indicators))
               )

datos_model <- datos_model %>% arrange(iso2c, year) %>% 
        mutate(hdi_diff = hdi - dplyr::lag(hdi), 
               NY.GDP.PCAP.CD_diff = NY.GDP.PCAP.CD - dplyr::lag(NY.GDP.PCAP.CD),
               DT.ODA.ALLD.CD_diff = DT.ODA.ALLD.CD - dplyr::lag(DT.ODA.ALLD.CD),
               DT.ODA.ODAT.PC.ZS_diff = DT.ODA.ODAT.PC.ZS - dplyr::lag(DT.ODA.ODAT.PC.ZS)) %>%
        filter(!year %in% c(2001))

vis_dat(datos_model)

Modelos Regresion Lineal

Probando modelos sencillos, regresion lineal, Minimos cuadrados, datos panel, HDI o GDP o sus differecias

HDI ~ ODA.ALL

HDI = ODA.ALL + CC + GE + PV + RQ + RL + VA + POP.GROW

summary(lm(hdi ~ DT.ODA.ALLD.CD + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW, data=datos_model))

Call:
lm(formula = hdi ~ DT.ODA.ALLD.CD + CC.EST + GE.EST + PV.EST + 
    RQ.EST + RL.EST + VA.EST + SP.POP.GROW, data = datos_model)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.24376 -0.05200 -0.00272  0.05310  0.48585 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)     6.624e-01  6.715e-03  98.642  < 2e-16 ***
DT.ODA.ALLD.CD  6.180e-12  2.369e-12   2.609 0.009195 ** 
CC.EST         -7.398e-02  9.048e-03  -8.176 7.13e-16 ***
GE.EST          1.115e-01  9.458e-03  11.790  < 2e-16 ***
PV.EST          1.501e-02  3.885e-03   3.864 0.000117 ***
RQ.EST         -6.752e-04  9.569e-03  -0.071 0.943761    
RL.EST          2.889e-02  1.046e-02   2.762 0.005834 ** 
VA.EST         -1.363e-02  4.712e-03  -2.892 0.003895 ** 
SP.POP.GROW    -3.803e-02  2.400e-03 -15.849  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.08028 on 1251 degrees of freedom
Multiple R-squared:  0.427, Adjusted R-squared:  0.4234 
F-statistic: 116.6 on 8 and 1251 DF,  p-value: < 2.2e-16
# Todas las variables son significativas al 99% excepto Regulatory Quality

HDI ~ ODA.PC

HDI = ODA.PC + CC + GE + PV + RQ + RL + VA + POP.GROW

summary(lm(hdi ~ DT.ODA.ODAT.PC.ZS + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW, data=datos_model))

Call:
lm(formula = hdi ~ DT.ODA.ODAT.PC.ZS + CC.EST + GE.EST + PV.EST + 
    RQ.EST + RL.EST + VA.EST + SP.POP.GROW, data = datos_model)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.23281 -0.05385 -0.00335  0.05343  0.43779 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)        6.449e-01  7.101e-03  90.823  < 2e-16 ***
DT.ODA.ODAT.PC.ZS  2.411e-04  3.386e-05   7.120 1.81e-12 ***
CC.EST            -9.071e-02  9.130e-03  -9.935  < 2e-16 ***
GE.EST             1.205e-01  9.294e-03  12.968  < 2e-16 ***
PV.EST             6.662e-03  3.532e-03   1.886 0.059520 .  
RQ.EST             8.239e-03  9.499e-03   0.867 0.385940    
RL.EST             2.907e-02  1.017e-02   2.857 0.004342 ** 
VA.EST            -1.744e-02  4.658e-03  -3.745 0.000189 ***
SP.POP.GROW       -3.805e-02  2.344e-03 -16.231  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.07891 on 1251 degrees of freedom
Multiple R-squared:  0.4464,    Adjusted R-squared:  0.4428 
F-statistic: 126.1 on 8 and 1251 DF,  p-value: < 2.2e-16
# Todas las variables son significativas al 99% excepto Regulatory Quality

GPD.PC ~ ODA.ALL

GPD.PC = ODA.ALL + CC + GE + PV + RQ + RL + VA + POP.GROW

summary(lm(NY.GDP.PCAP.CD ~ DT.ODA.ALLD.CD + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW, data=datos_model))

Call:
lm(formula = NY.GDP.PCAP.CD ~ DT.ODA.ALLD.CD + CC.EST + GE.EST + 
    PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW, data = datos_model)

Residuals:
    Min      1Q  Median      3Q     Max 
-2084.8  -611.6  -147.7   441.7  4237.9 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)     2.461e+03  7.400e+01  33.256  < 2e-16 ***
DT.ODA.ALLD.CD  4.006e-09  2.611e-08   0.153 0.878095    
CC.EST         -9.011e+01  9.972e+01  -0.904 0.366385    
GE.EST          7.899e+02  1.042e+02   7.579 6.77e-14 ***
PV.EST          1.556e+02  4.281e+01   3.634 0.000291 ***
RQ.EST          9.097e+01  1.055e+02   0.863 0.388498    
RL.EST          1.399e+02  1.153e+02   1.214 0.225078    
VA.EST         -2.908e+02  5.193e+01  -5.600 2.63e-08 ***
SP.POP.GROW    -2.049e+02  2.645e+01  -7.747 1.93e-14 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 884.7 on 1251 degrees of freedom
Multiple R-squared:  0.286, Adjusted R-squared:  0.2814 
F-statistic: 62.63 on 8 and 1251 DF,  p-value: < 2.2e-16
# Todas las variables son significativas al 99% excepto ODA.ALL, Control of Corruption, Regulatory Quality y Rule of Law

GPD.PC ~ ODA.PC

GPD.PC = ODA.PC + CC + GE + PV + RQ + RL + VA + POP.GROW

summary(lm(NY.GDP.PCAP.CD ~ DT.ODA.ODAT.PC.ZS + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW, data=datos_model))

Call:
lm(formula = NY.GDP.PCAP.CD ~ DT.ODA.ODAT.PC.ZS + CC.EST + GE.EST + 
    PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW, data = datos_model)

Residuals:
    Min      1Q  Median      3Q     Max 
-1876.5  -586.5  -166.4   364.0  4382.8 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)       2152.1327    76.8078  28.020  < 2e-16 ***
DT.ODA.ODAT.PC.ZS    3.5326     0.3663   9.644  < 2e-16 ***
CC.EST            -314.1459    98.7580  -3.181   0.0015 ** 
GE.EST             887.1625   100.5340   8.825  < 2e-16 ***
PV.EST              91.4305    38.2095   2.393   0.0169 *  
RQ.EST             252.0015   102.7496   2.453   0.0143 *  
RL.EST              83.6278   110.0482   0.760   0.4474    
VA.EST            -343.0970    50.3834  -6.810 1.51e-11 ***
SP.POP.GROW       -215.6641    25.3596  -8.504  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 853.6 on 1251 degrees of freedom
Multiple R-squared:  0.3354,    Adjusted R-squared:  0.3311 
F-statistic: 78.91 on 8 and 1251 DF,  p-value: < 2.2e-16
# Todas las variables son significativas al 99% excepto Rule of Law

Se revisara las relaciones entre las variables graficamente

Visualizacion de datos

HDI

my_plot  <- list()

for (col in c('DT.ODA.ALLD.CD', 'DT.ODA.ODAT.PC.ZS', 'DT.ODA.ALLD.CD_diff', 'DT.ODA.ODAT.PC.ZS_diff', 
              'CC.EST', 'GE.EST', 'PV.EST', 'RQ.EST', 'RL.EST', 'VA.EST')) {
  my_plot[[col]] <- plot_ly(x = datos_model[[col]], y = datos_model[['hdi']], type = 'scatter', mode = 'markers', name = col)  
}
subplot(my_plot[1:4], nrows = 2, margin = 0.05) %>% layout(title = 'HDI vs ODA')
subplot(my_plot[5:10], nrows = 2, margin = 0.05) %>% layout(title = 'HDI vs GOB')

HDI diff

my_plot  <- list()

for (col in c('DT.ODA.ALLD.CD', 'DT.ODA.ODAT.PC.ZS', 'DT.ODA.ALLD.CD_diff', 'DT.ODA.ODAT.PC.ZS_diff', 
              'CC.EST', 'GE.EST', 'PV.EST', 'RQ.EST', 'RL.EST', 'VA.EST')) {
  my_plot[[col]] <- plot_ly(x = datos_model[[col]], y = datos_model[['hdi_diff']], type = 'scatter', mode = 'markers', name = col)  
}
subplot(my_plot[1:4], nrows = 2, margin = 0.05) %>% layout(title = 'HDI diff vs ODA')
subplot(my_plot[5:10], nrows = 2, margin = 0.05) %>% layout(title = 'HDI diff vs GOB')

GPD.PC

my_plot  <- list()
for (col in c('DT.ODA.ALLD.CD', 'DT.ODA.ODAT.PC.ZS', 'DT.ODA.ALLD.CD_diff', 'DT.ODA.ODAT.PC.ZS_diff', 
              'CC.EST', 'GE.EST', 'PV.EST', 'RQ.EST', 'RL.EST', 'VA.EST')) {
  my_plot[[col]] <- plot_ly(x = datos_model[[col]], y = datos_model[['NY.GDP.PCAP.CD']], 
                            type = 'scatter', mode = 'markers', name = col)  
}
subplot(my_plot[1:4], nrows = 2, margin = 0.05) %>% layout(title = 'GDP.PC vs ODA')
subplot(my_plot[5:10], nrows = 2, margin = 0.05) %>% layout(title = 'GDP.PC vs GOB')
NA

GPD.PC diff

my_plot  <- list()
for (col in c('DT.ODA.ALLD.CD', 'DT.ODA.ODAT.PC.ZS', 'DT.ODA.ALLD.CD_diff', 'DT.ODA.ODAT.PC.ZS_diff', 
              'CC.EST', 'GE.EST', 'PV.EST', 'RQ.EST', 'RL.EST', 'VA.EST')) {
  my_plot[[col]] <- plot_ly(x = datos_model[[col]], y = datos_model[['NY.GDP.PCAP.CD_diff']], type = 'scatter', mode = 'markers', name = col)  
}
subplot(my_plot[1:4], nrows = 2, margin = 0.05) %>% layout(title = 'GDP.PC diff vs ODA')
subplot(my_plot[5:10], nrows = 2, margin = 0.05) %>% layout(title = 'GDP.PC diff vs GOB')
NA

No se ve una relacion clara, hay tanto paises con punteos altos y bajos de GOB que tienen tanto HID altos o bajos Quiza puede verse una leve relacion de mayor punteo en GOB acompañado de mejor punteo den HDI Los datos de GPD si muestran una relacion positiva con el HDI visto en las graficas

Se realizara el mismo proceso con el crecimiento o decrecimiento de HDI anual

Visualizacion de Datos historia

Viendo la historia de las variables en el tiempo (por pais)

datos_model %>% filter(iso2c == 'AF') %>% plot_ly(x = ~year) %>% 
  add_trace(y = ~hdi, type = 'scatter', mode = 'lines+markers', name = 'hdi') %>% 
  add_trace(y = ~NY.GDP.PCAP.CD / 1000, type = 'scatter', mode = 'lines+markers', name = 'gdp.pc') %>% 
  add_trace(y = ~DT.ODA.ALLD.CD / 10000000000, type = 'scatter', mode = 'lines+markers', name = 'ODA.ALL')  %>% 
  add_trace(y = ~DT.ODA.ODAT.PC.ZS / 1000, type = 'scatter', mode = 'lines+markers', name = 'ODA.PC')  %>% 
  add_trace(y = ~CC.EST, type = 'scatter', mode = 'lines+markers', name = 'CC') %>% 
  add_trace(y = ~GE.EST, type = 'scatter', mode = 'lines+markers', name = 'GE')  %>% 
  add_trace(y = ~PV.EST, type = 'scatter', mode = 'lines+markers', name = 'PV')  %>% 
  add_trace(y = ~RQ.EST, type = 'scatter', mode = 'lines+markers', name = 'RQ')  %>% 
  add_trace(y = ~RL.EST, type = 'scatter', mode = 'lines+markers', name = 'RL')  %>% 
  add_trace(y = ~VA.EST, type = 'scatter', mode = 'lines+markers', name = 'VA')

Modelos Efectos fijos

HDI ~ ODA.ALL

plm(hdi ~ DT.ODA.ALLD.CD + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW, data=datos_model,
    index = c("iso2c", "year"), model = "within")

Model Formula: hdi ~ DT.ODA.ALLD.CD + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + 
    VA.EST + SP.POP.GROW

Coefficients:
DT.ODA.ALLD.CD         CC.EST         GE.EST         PV.EST         RQ.EST         RL.EST         VA.EST    SP.POP.GROW 
    2.0890e-11    -8.3315e-03     7.5391e-03    -4.4617e-03     2.0938e-02     3.2560e-02     6.9264e-03    -5.5903e-03 

HDI ~ ODA.PC

plm(hdi ~ DT.ODA.ODAT.PC.ZS + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW, data=datos_model,
    index = c("iso2c", "year"), model = "within")

Model Formula: hdi ~ DT.ODA.ODAT.PC.ZS + CC.EST + GE.EST + PV.EST + RQ.EST + 
    RL.EST + VA.EST + SP.POP.GROW

Coefficients:
DT.ODA.ODAT.PC.ZS            CC.EST            GE.EST            PV.EST            RQ.EST            RL.EST 
        0.0001890        -0.0090492        -0.0012169        -0.0066846         0.0225845         0.0433849 
           VA.EST       SP.POP.GROW 
        0.0048044        -0.0089386 
#summary(lm(hdi ~ DT.ODA.ODAT.PC.ZS + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW + iso2c, data=datos_model))
# Corruption Control, Government Effectiveness y Voice and Accountability no son significativas

GDP.PC ~ ODA.ALL

plm(NY.GDP.PCAP.CD ~ DT.ODA.ALLD.CD + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW, data=datos_model,
    index = c("iso2c", "year"), model = "within")

Model Formula: NY.GDP.PCAP.CD ~ DT.ODA.ALLD.CD + CC.EST + GE.EST + PV.EST + 
    RQ.EST + RL.EST + VA.EST + SP.POP.GROW

Coefficients:
DT.ODA.ALLD.CD         CC.EST         GE.EST         PV.EST         RQ.EST         RL.EST         VA.EST    SP.POP.GROW 
    2.6336e-07    -2.1804e+01     4.6280e+02     1.9040e+02    -5.2602e+01    -1.6883e+02    -2.6173e+01    -3.7759e+01 

GDP.PC ~ ODA.PC

plm(NY.GDP.PCAP.CD ~ DT.ODA.ODAT.PC.ZS + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW, data=datos_model,
    index = c("iso2c", "year"), model = "within")

Model Formula: NY.GDP.PCAP.CD ~ DT.ODA.ODAT.PC.ZS + CC.EST + GE.EST + PV.EST + 
    RQ.EST + RL.EST + VA.EST + SP.POP.GROW

Coefficients:
DT.ODA.ODAT.PC.ZS            CC.EST            GE.EST            PV.EST            RQ.EST            RL.EST 
           3.6490          -82.8703          370.2174          156.9927          -13.5138           -2.0353 
           VA.EST       SP.POP.GROW 
         -66.6104          -85.1696 
#summary(lm(NY.GDP.PCAP.CD ~ DT.ODA.ODAT.PC.ZS + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW + iso2c, data=datos_model))
# Corruption Control, Regulatory Quality, Rule of Law y Voice and Accountability no son significativas

LS0tDQp0aXRsZTogIk9mZmljaWFsIERldmVsb3BtZW50IEFzc2lzdGFuY2UgYW5kIEluc3RpdHV0aW9uYWwgUXVhbGl0eSBvbiBVbmRldmVsb3BlZCBjb3VudHJpZXMiDQphdXRob3I6ICJPc2NhciBFZHVhcmRvIE1vcmFsZXMgQ8OhcmRlbmFzIg0KZGF0ZTogIjIwMjQtMDgtMDUiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCg0KSW50ZXJuYXRpb25hbCBhaWQgbWF5IHRha2UgdGhlIGZvcm0gb2YgbXVsdGlsYXRlcmFsIGFpZCAtLSBwcm92aWRlZCB0aHJvdWdoIGludGVybmF0aW9uYWwgYm9kaWVzIHN1Y2ggYXMgdGhlIFVOLCBvciBOR09zIHN1Y2ggYXMgT3hmYW0gLS0gb3IgYmlsYXRlcmFsIGFpZCwgd2hpY2ggb3BlcmF0ZXMgb24gYSBnb3Zlcm5tZW50LXRvLWdvdmVybm1lbnQgYmFzaXMuIFRoZXJlIGlzIGNvbnNpZGVyYWJsZSBkZWJhdGUgYWJvdXQgd2hldGhlciBpbnRlcm5hdGlvbmFsIGFpZCB3b3JrcywgaW4gdGhlIHNlbnNlIG9mIHJlZHVjaW5nIHBvdmVydHkgYW5kIHN0aW11bGF0aW5nIGRldmVsb3BtZW50Lg0KDQpIb3dldmVyLCB0aGUgZWZmZWN0aXZlbmVzcyBvZiBhaWQgaXMgb2Z0ZW4gZGlsdXRlZCBieSBjb3JydXB0aW9uLiBBaWQgaXMgaW52YXJpYWJseSBjaGFubmVsZWQgdGhyb3VnaCB0aGUgZ292ZXJubWVudHMgb2YgcmVjaXBpZW50IGNvdW50cmllcywgaW4gd2hpY2ggcG93ZXIgaXMgb2Z0ZW4gY29uY2VudHJhdGVkIGluIHRoZSBoYW5kcyBvZiBhIGZldyBwb2xpdGljaWFucyBhbmQgYnVyZWF1Y3JhdHMsIGFuZCB0aGUgbWVjaGFuaXNtcyBvZiBhY2NvdW50YWJpbGl0eSBhcmUsIGF0IGJlc3QsIHBvb3JseSBkZXZlbG9wZWQuIFRoaXMgdGVuZHMgdG8gYmVuZWZpdCBjb3JydXB0IGxlYWRlcnMgYW5kIGVsaXRlcyByYXRoZXIgdGhhbiB0aGUgcGVvcGxlLCBwcm9qZWN0cyBhbmQgcHJvZ3JhbXMgZm9yIHdoaWNoIGl0IHdhcyBpbnRlbmRlZC4NCg0KXHRleHRiZntXYXR0cywgQ2FybC4gKDIwMTQpLiBSZTogRG9lcyBmb3JlaWduIGFpZCBoZWxwIHRoZSBkZXZlbG9waW5nIGNvdW50cmllcyB0b3dhcmRzIGRldmVsb3BtZW50Py4gUmV0cmlldmVkIGZyb206ICRodHRwczovL3d3dy5yZXNlYXJjaGdhdGUubmV0L3Bvc3QvRG9lc19mb3JlaWduX2FpZF9oZWxwX3RoZV9kZXZlbG9waW5nX2NvdW50cmllc190b3dhcmRzX2RldmVsb3BtZW50LzUzMjIwMDVlZDAzOWIxZTc2NDhiNDU5Yy9jaXRhdGlvbi9kb3dubG9hZC4kfQ0KDQpUaGUgaHlwb3RoZXNpcyB0aGF0IGZvcmVpZ24gYWlkIGNhbiBwcm9tb3RlIGdyb3d0aCBpbiBkZXZlbG9waW5nIGNvdW50cmllcyB3YXMgZXhwbG9yZWQsIHVzaW5nIHBhbmVsIGRhdGEgc2VyaWVzIGZvciBmb3JlaWduIGFpZCwgd2hpbGUgYWNjb3VudGluZyBmb3IgcmVnaW9uYWwgZGlmZmVyZW5jZXMgaW4gQXNpYW4sIEFmcmljYW4sIExhdGluIEFtZXJpY2FuLCBhbmQgdGhlIENhcmliYmVhbiBjb3VudHJpZXMgYXMgd2VsbCBhcyB0aGUgZGlmZmVyZW5jZXMgaW4gaW5jb21lIGxldmVscywgdGhlIHJlc3VsdHMgb2YgdGhpcyBzdHVkeSBhbHNvIGluZGljYXRlIHRoYXQgZm9yZWlnbiBhaWQgaGFzIG1peGVkIGVmZmVjdHMgb24gZWNvbm9taWMgZ3Jvd3RoIGluIGRldmVsb3BpbmcgY291bnRyaWVzLg0KDQpcdGV4dGJme0VrYW5heWFrZSwgRS4gJiBDaGF0cm5hLCBEYXNoYS4gKDIwMTApLiBUaGUgZWZmZWN0IG9mIGZvcmVpZ24gYWlkIG9uIGVjb25vbWljIGdyb3d0aCBpbiBkZXZlbG9waW5nIGNvdW50cmllcy4gSm91cm5hbCBvZiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIGFuZCBDdWx0dXJhbCBTdHVkaWVzLiAzLn0NCg0KVGhpcyBzdHVkeSBleGFtaW5lcyB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGZvcmVpZ24gYWlkLCBpbnN0aXR1dGlvbmFsIHN0cnVjdHVyZSwgYW5kIGVjb25vbWljIHBlcmZvcm1hbmNlIGZvciA4MCBjb3VudHJpZXMgaW4gRXVyb3BlLCBBbWVyaWNhLCBBZnJpY2EsIGFuZCBBc2lhLiBJdCBpcyBmb3VuZCB0aGF0IG9mZmljaWFsIGRldmVsb3BtZW50IGFzc2lzdGFuY2UgYW5kIHRoZSBxdWFsaXR5IG9mIGluc3RpdHV0aW9uYWwgc3RydWN0dXJlIGluIHRoZSBzYW1wbGUgY291bnRyaWVzIGFmZmVjdCBlY29ub21pYyBncm93dGggcG9zaXRpdmVseS4NCg0KXHRleHRiZntIYXlhbG/En2x1LCBQxLFuYXIuICgyMDIzKS4gRm9yZWlnbiBBaWQsIEluc3RpdHV0aW9ucywgYW5kIEVjb25vbWljIFBlcmZvcm1hbmNlIGluIERldmVsb3BpbmcgQ291bnRyaWVzLiBFc2tpxZ9laGlyIE9zbWFuZ2F6aSDDnG5pdmVyc2l0ZXNpIMSwa3Rpc2FkaSB2ZSDEsGRhcmkgQmlsaW1sZXIgRGVyZ2lzaS4gMTguIDc0OC03NjUuIDEwLjE3MTUzL29ndWlpYmYuMTI3NzM0OC59DQoNCiMgQ2FyZ2FuZG8gTGlicmVyaWFzDQoNCkFsZ3VuYXMgbGlicmVyaWFzIHkgcGFxdWV0ZXMgdXNhZG9zIHBhcmEgb2J0ZW5lciB5IGRlc2NhcmdhciBsb3MgZGF0b3MNCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkgIyBtYW5lam8gZGUgZGF0YWZyYW1lcw0KbGlicmFyeShXREkpICAgICAgICMgbGlicmVyaWEgcGFyYSBhY2NlZGVyIGEgbWV0YWRhdGEgZGUgYmFuY28gbXVuZGlhbA0KbGlicmFyeShyZWFkeGwpICAgICMgbGVlciBhcmNoaXZvcyBkZSBleGNlbA0KbGlicmFyeShyZWFkcikgICAgICMgbGVlciBhcmNoaXZvcyBjc3YNCmxpYnJhcnkodmlzZGF0KSAgICAjIHZpc3VhbGl6YWNpb24gZGUgZGF0b3MgY29tbyBncmFmaWNvcw0KbGlicmFyeShwbG90bHkpICAgICMgZ3JhZmljb3MNCmxpYnJhcnkocHVycnIpICAgICAjIGZ1bmNpb24gbWFwDQpsaWJyYXJ5KHBsbSkgICAgICAgIyBtb2RlbG9zIGxpbmVhbGVzIHBhcmEgZGF0b3MgcGFuZWwNCmxpYnJhcnkoY2FyKSAgICAgICAjIHRlc3QgeSB1dGlsaWRhZGRlcyBwYXJhIG1vZGVsb3MNCmBgYA0KDQojIE9idGVuZXIgZGF0b3MNCg0KRGF0b3MgcGFyYSBwYWlzZXMgYmFqb3MgaW5ncmVzb3Mgc2VhbiB1dGlsaXphZG9zLCBzZWd1biBjbGFzaWZpY2FjacOzbiBkZWwgYmFuY28gbXVuZGlhbCwgaGF5IDI2IHBhaXNlcyBkZSBiYWpvcyBpbmdyZXNvcyB5IDUxIGRlIGluZ3Jlc29zIG1lZGlvcyBiYWpvcw0KDQpgYGB7cn0NCmNvdW50cnlfY2xhc3MgPC0gcmVhZF9leGNlbCgiQ0xBU1MueGxzeCIpDQoNCmNvdW50cnlfY2xhc3MgJT4lDQogIGZpbHRlcighaXMubmEoUmVnaW9uKSwgIWlzLm5hKGBJbmNvbWUgZ3JvdXBgKSkgJT4lDQogIGdyb3VwX2J5KGBJbmNvbWUgZ3JvdXBgKSAlPiUNCiAgc3VtbWFyaXNlKGNvdW50cmllcyA9IG4oKSkgJT4lDQogIGFycmFuZ2UoZmFjdG9yKGBJbmNvbWUgZ3JvdXBgLCBsZXZlbHMgPSBjKCdIaWdoIGluY29tZScsICdVcHBlciBtaWRkbGUgaW5jb21lJywgJ0xvd2VyIG1pZGRsZSBpbmNvbWUnLCAnTG93IGluY29tZScpKSkNCmBgYA0KDQpMaXN0YWRvIGRlIHBhaXNlcyBhIGFuYWxpc2FyOg0KDQpgYGB7cn0NCm15X2NvdW50cmllcyA8LSBjb3VudHJ5X2NsYXNzICU+JQ0KICBmaWx0ZXIoIWlzLm5hKFJlZ2lvbiksIGBJbmNvbWUgZ3JvdXBgICVpbiUgYygnTG93IGluY29tZScsICdMb3dlciBtaWRkbGUgaW5jb21lJykpICU+JQ0KICBzZWxlY3QoQ29kZSkNCm15X2NvdW50cmllcw0KYGBgDQoNCkhhY2VyIGxhIHJlc3BlY3RpdmEgYXNvY2lhY2lvbiBkZSBub21icmVzIGlzbzNjIGUgaXNvMmMNCg0KYGBge3J9DQpteV9jb3VudHJpZXMkaXNvMmMgPC0gV0RJX2RhdGEkY291bnRyeSAlPiUNCiAgZmlsdGVyKGlzbzNjICVpbiUgbXlfY291bnRyaWVzJENvZGUpICU+JQ0KICAuJGlzbzJjDQpteV9jb3VudHJpZXMNCmBgYA0KDQpEYXRvcyBkZWwgYmFuY28gbXVuZGlhbCAocGFyYSBPREEgeSBsb3MgaW5kaWNlcyBkZSBnb2Jlcm5hbnphKSB5IGVsIEh1bWFuIERldmVsb3BtZW50IFJlcG9ydHMgQVBJIHNvbiBkZXNjYXJnYWRvcyBkZXNkZSBzY3JpcHRzIGRlIFB5dGhvbi4gU29uIGFsbWFjZW5hZG9zIGVuIGFyY2hpdm9zIENTViB5IGx1ZWdvIHNvbiBjYXJnYWRvcyBhcXVpOg0KDQojIyBIREkNCg0KYGBge3J9DQpkYXRvc19IREkgPC0gcmVhZF9jc3YoImRhdG9zX3B5dGhvbl9IREkuY3N2IiwgY29sX25hbWVzID0gYygnQ29kZScsICdpc28yYycsICdpbmRpY2F0b3InLCAneWVhcicsICd2YWx1ZScpLCANCiAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBsaXN0KGNvbF9jaGFyYWN0ZXIoKSwgY29sX2NoYXJhY3RlcigpLCBjb2xfY2hhcmFjdGVyKCksIGNvbF9kb3VibGUoKSwgY29sX2RvdWJsZSgpKSkNCg0KaGRpX2luZGljYXRvcnMgPC0gZGF0b3NfSERJICU+JSBkaXN0aW5jdChpbmRpY2F0b3IpICU+JSAuJGluZGljYXRvcg0KYGBgDQoNCiMjIE9EQSwgR0RQLCBQT1AuR1JPVw0KDQpgYGB7cn0NCm9kYV9pbmRpY2F0b3JzIDwtIGMoDQonRFRfT0RBX0FMTERfQ0QnLA0KJ0RUX09EQV9BTExEX0tEJywNCidEVF9PREFfT0FUTF9DRCcsDQonRFRfT0RBX09BVExfS0QnLA0KJ0RUX09EQV9PREFUX0NEJywNCidEVF9PREFfT0RBVF9HSV9aUycsDQonRFRfT0RBX09EQVRfR05fWlMnLA0KJ0RUX09EQV9PREFUX0tEJywNCidEVF9PREFfT0RBVF9NUF9aUycsDQonRFRfT0RBX09EQVRfUENfWlMnLA0KJ0RUX09EQV9PREFUX1hQX1pTJw0KKQ0KZ29iX2luZGljYXRvcnMgPC0gYygNCidDQ19FU1QnLA0KJ0NDX05PX1NSQycsDQonQ0NfUEVSX1JOSycsDQonQ0NfUEVSX1JOS19MT1dFUicsDQonQ0NfUEVSX1JOS19VUFBFUicsDQonQ0NfU1REX0VSUicsDQonR0VfRVNUJywNCidHRV9OT19TUkMnLA0KJ0dFX1BFUl9STksnLA0KJ0dFX1BFUl9STktfTE9XRVInLA0KJ0dFX1BFUl9STktfVVBQRVInLA0KJ0dFX1NURF9FUlInLA0KJ1BWX0VTVCcsDQonUFZfTk9fU1JDJywNCidQVl9QRVJfUk5LJywNCidQVl9QRVJfUk5LX0xPV0VSJywNCidQVl9QRVJfUk5LX1VQUEVSJywNCidQVl9TVERfRVJSJywNCidSUV9FU1QnLA0KJ1JRX05PX1NSQycsDQonUlFfUEVSX1JOSycsDQonUlFfUEVSX1JOS19MT1dFUicsDQonUlFfUEVSX1JOS19VUFBFUicsDQonUlFfU1REX0VSUicsDQonUkxfRVNUJywNCidSTF9OT19TUkMnLA0KJ1JMX1BFUl9STksnLA0KJ1JMX1BFUl9STktfTE9XRVInLA0KJ1JMX1BFUl9STktfVVBQRVInLA0KJ1JMX1NURF9FUlInLA0KJ1ZBX0VTVCcsDQonVkFfTk9fU1JDJywNCidWQV9QRVJfUk5LJywNCidWQV9QRVJfUk5LX0xPV0VSJywNCidWQV9QRVJfUk5LX1VQUEVSJywNCidWQV9TVERfRVJSJw0KKQ0KZ2RwX2luZGljYXRvcnMgPC0gYygNCidOWV9BREpfTk5UWV9QQ19DRCcsDQonTllfQURKX05OVFlfUENfS0QnLA0KJ05ZX0FESl9OTlRZX1BDX0tEX1pHJywNCidOWV9HRFBfUENBUF9DTicsDQonTllfR0RQX1BDQVBfS04nLA0KJ05ZX0dEUF9QQ0FQX0NEJywNCidOWV9HRFBfUENBUF9LRCcsDQonTllfR0RQX01LVFBfS0RfWkcnLA0KJ05ZX0dEUF9ERUZMX1pTX0FEJywNCidOWV9HRFBfREVGTF9aUycsDQonTllfR0RQX01LVFBfQ0QnLA0KJ05ZX0dEUF9NS1RQX0NOJywNCidOWV9HRFBfTUtUUF9LTicsDQonTllfR0RQX01LVFBfS0QnLA0KJ05ZX0dEUF9QQ0FQX0tEX1pHJywNCidOWV9HRFBfUENBUF9QUF9LRCcsDQonTllfR0RQX1BDQVBfUFBfQ0QnLA0KJ1NMX0dEUF9QQ0FQX0VNX0tEJywNCidTUF9QT1BfR1JPVycNCikNCg0KZGF0b3NfV0IgPC0gZGF0YS5mcmFtZShpbmRpY2F0b3IgPSBjaGFyYWN0ZXIoKSwgaXNvMmMgPSBjaGFyYWN0ZXIoKSwgeWVhciA9IGRvdWJsZSgpLCB2YWx1ZSA9IGRvdWJsZSgpKQ0KDQpzdXBwcmVzc1dhcm5pbmdzKA0KICBmb3IgKGluZGljYXRvciBpbiBjKG9kYV9pbmRpY2F0b3JzLCBnb2JfaW5kaWNhdG9ycywgZ2RwX2luZGljYXRvcnMpKSB7DQogICAgZGF0b3NfV0IgPC0gcmJpbmQoZGF0b3NfV0IsIHJlYWRfY3N2KHBhc3RlKCJkYXRvc19weXRob24iLCBpbmRpY2F0b3IsICIuY3N2Iiwgc2VwID0nJyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF9uYW1lcyA9IGMoJ2luZGljYXRvcicsICdpc28yYycsICd5ZWFyJywgJ3ZhbHVlJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gbGlzdChjb2xfY2hhcmFjdGVyKCksIGNvbF9jaGFyYWN0ZXIoKSwgY29sX2RvdWJsZSgpLCBjb2xfZG91YmxlKCkpKSkNCiAgfQ0KKQ0KYGBgDQoNCiMgTWFuaXB1bGFjaW9uIGRlIERhdG9zIHsudGFic2V0IC50YWJzZXQtZmFkZX0NCg0KVHJhbnNmb3JtYXIgbGEgZXN0cnVjdHVyYSBkZSBsb3MgZGF0b3MgcGFyYSB1bmEgbWVqb3IgY29tcHJlbnNpb24NCg0KYGBge3J9DQpkYXRvc19wYXBlciA8LSByYmluZChkYXRvc19XQiwgZGF0b3NfSERJICU+JSBzZWxlY3QoaW5kaWNhdG9yLCBpc28yYywgeWVhciwgdmFsdWUpKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGluZGljYXRvciwgdmFsdWVzX2Zyb20gPSB2YWx1ZSkNCmBgYA0KDQpSZXZpc2FyIHF1ZSBkYXRvcyBlc3RhbiBjb21vIGZhbHRhbnRlcw0KDQojIyBPREENCg0KYGBge3J9DQp2aXNfZGF0KGRhdG9zX3BhcGVyICU+JSBzZWxlY3QoYWxsX29mKGdzdWIoIl8iLCAiLiIsIG9kYV9pbmRpY2F0b3JzKSkpKSANCiAgIyBEVC5PREEuT0FUTC5DRCBhbmQgRFQuT0RBLk9BVEwuS0QgZmFsdGFuDQogICMgRFQuT0RBLk9EQVQuR0kuWlMsIERULk9EQS5PREFULkdOLlpTLCBEVC5PREEuT0RBVC5NUC5aUyBhbmQgRFQuT0RBLk9EQVQuWFAuWlMgdGllbmVuIGZhbHRhcw0KICAjIFVuIHBhciBkZSBvY3VycmVuY2lhcyBwYWlzLWHDsW8gcXVlIGZhbHRhbiBkYXRvcw0KYGBgDQoNCiMjIA0KDQojIyBHRFANCg0KYGBge3J9DQp2aXNfZGF0KGRhdG9zX3BhcGVyICU+JSBzZWxlY3QoTlkuR0RQLlBDQVAuQ04sIE5ZLkdEUC5QQ0FQLkNEKSkgDQogICMgTlkuR0RQLlBDQVAuQ04sIE5ZLkdEUC5QQ0FQLkNELCBOWS5HRFAuTUtUUC5DRCwgTlkuR0RQLk1LVFAuQ04gc29uIGJ1ZW5vcyBjYW5kaWRhdG9zIHBhcmEgdXNhciBjb21vIHZhcmlhYmxlcywgDQogICMgJ1NZJ2ZhbHRhIFBJQiBwZXIgQ2FwaXRhIGVuIDIwMjIsIDIwMjMgc2luIGRhdG9zIGFsZ3Vub3MgcGFpc2VzDQpgYGANCg0KIyMgDQoNCiMjIEdPVg0KDQpgYGB7cn0NCnZpc19kYXQoZGF0b3NfcGFwZXIgJT4lIGFycmFuZ2UoeWVhcikgJT4lIHNlbGVjdChhbGxfb2YoZ3N1YigiXyIsICIuIiwgZ29iX2luZGljYXRvcnMpKSkpIA0KICAjIERhdG9zIGRlbCAyMDAwIHBhcmEgYXRyYXMgdGllbmVuIGVzcGFjaW9zIGZhbHRhbnRlcyANCmBgYA0KDQojIyANCg0KIyMgSERJDQoNCmBgYHtyfQ0KdmlzX2RhdChkYXRvc19wYXBlciAlPiUgc2VsZWN0KGFsbF9vZihoZGlfaW5kaWNhdG9ycykpKSANCiAgIyBhYnIsIGNvMl9wcm9kLCBsZSwgbGVfZiwgbGVfbSwgbW1yIHNvbiBsYXMgcG9jYXMgY2F0ZWdvcmlhcyBzaW4gZGF0b3MgZmFsdGFudGVzDQogICMgaGRpIGZhbHRhbnRlIGVuIG11bHRpcGxlcyBvY2FjaW9uZXMNCmBgYA0KDQojIyANCg0KIyMgUE9QLkdST1cNCg0KYGBge3J9DQp2aXNfZGF0KGRhdG9zX3BhcGVyICU+JSBhcnJhbmdlKGlzbzJjKSAlPiUgc2VsZWN0KFNQLlBPUC5HUk9XKSkgDQogICMgWlcgbm8gdGllbmUgZGF0b3MgZGUgY3JlY2ltaWVudG8gcG9ibGFjaW9uYWwNCg0KYGBgDQojIw0KDQpUb21hbmRvIGVuIGN1ZW50YSBsb3MgZGF0b3MgZmFsdGFudGVzLCBoYWNlciBmaWx0cm9zIHBhcmEgc2VsZWNjaW9uYXIgdW5hIG11ZXN0cmEgbWFzIHBlcXVlw7FhDQoNCiMjIDIwMDEgLSAyMDIyDQpgYGB7cn0NCnZpc19kYXQoZGF0b3NfcGFwZXIgJT4lIA0KICAgICAgICBmaWx0ZXIoIWlzbzJjICVpbiUgYygnU1MnLCAnWlcnLCAnQlQnLCAnRVInLCAnR1cnLCAnS1AnLCAnTEInLCAnTkcnLCAnUFMnLCAnU08nLCAnVlUnLCAnRk0nLCAnS0knLCAnVEwnLCAnQ1YnLCAnU0InLCdTWScpLA0KICAgICAgICAgICAgICAgIXllYXIgJWluJSBjKDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMjMpKSAlPiUNCiAgICAgICAgc2VsZWN0KGlzbzJjLCB5ZWFyLCBoZGksIERULk9EQS5BTExELkNELCBEVC5PREEuQUxMRC5LRCwgRFQuT0RBLk9EQVQuQ0QsIERULk9EQS5PREFULktELCBEVC5PREEuT0RBVC5QQy5aUywgDQogICAgICAgICAgICAgICBOWS5HRFAuUENBUC5DTiwgTlkuR0RQLlBDQVAuQ0QsIFNQLlBPUC5HUk9XLCBhbGxfb2YoZ3N1YigiXyIsICIuIiwgZ29iX2luZGljYXRvcnMpKSwgDQogICAgICAgICAgICAgICApKQ0KYGBgDQojIw0KDQojIyAyMDAyIC0gMjAwMg0KYGBge3J9DQp2aXNfZGF0KGRhdG9zX3BhcGVyICU+JSANCiAgICAgICAgZmlsdGVyKCFpc28yYyAlaW4lIGMoJ1NTJywgJ1pXJywgJ0JUJywgJ0VSJywgJ0dXJywgJ0tQJywgJ0xCJywgJ05HJywgJ1BTJywgJ1NPJywgJ1ZVJywgJ0ZNJywgJ0tJJywgJ1RMJywgJ0NWJywgJ1NCJywnU1knKSwNCiAgICAgICAgICAgICAgICF5ZWFyICVpbiUgYygxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDIzKSkgJT4lDQogICAgICAgIHNlbGVjdChpc28yYywgeWVhciwgaGRpLCBEVC5PREEuQUxMRC5DRCwgRFQuT0RBLkFMTEQuS0QsIERULk9EQS5PREFULkNELCBEVC5PREEuT0RBVC5LRCwgRFQuT0RBLk9EQVQuUEMuWlMsIA0KICAgICAgICAgICAgICAgTlkuR0RQLlBDQVAuQ04sIE5ZLkdEUC5QQ0FQLkNELCBTUC5QT1AuR1JPVywgYWxsX29mKGdzdWIoIl8iLCAiLiIsIGdvYl9pbmRpY2F0b3JzKSksIA0KICAgICAgICAgICAgICAgKSkNCmBgYA0KIyMNCg0KRGUgMjIzMiBvYnNlcnZhY2lvbmVzIHJlZHVjaW1vcyBhIDEyNjAgKDIwMDIgaGFzdGEgMjAyMikgbyBhIDEzMjAgKDIwMDEgaGFzdGEgMjAyMikNCg0KQXBsaWNhciBPcGVyYWRvciBkaWZlcmVuY2lhDQoNCmBgYHtyfQ0KZGF0b3NfbW9kZWwgPC0gZGF0b3NfcGFwZXIgJT4lIA0KICAgICAgICBmaWx0ZXIoIWlzbzJjICVpbiUgYygnU1MnLCAnWlcnLCAnQlQnLCAnRVInLCAnR1cnLCAnS1AnLCAnTEInLCAnTkcnLCAnUFMnLCAnU08nLCAnVlUnLCAnRk0nLCAnS0knLCAnVEwnLCAnQ1YnLCAnU0InLCAnU1knKSwNCiAgICAgICAgICAgICAgICF5ZWFyICVpbiUgYygxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDIzKSkgJT4lDQogICAgICAgIHNlbGVjdChpc28yYywgeWVhciwgaGRpLCBEVC5PREEuQUxMRC5DRCwgRFQuT0RBLkFMTEQuS0QsIERULk9EQS5PREFULkNELCBEVC5PREEuT0RBVC5LRCwgRFQuT0RBLk9EQVQuUEMuWlMsIA0KICAgICAgICAgICAgICAgTlkuR0RQLlBDQVAuQ04sIE5ZLkdEUC5QQ0FQLkNELCBTUC5QT1AuR1JPVywgYWxsX29mKGdzdWIoIl8iLCAiLiIsIGdvYl9pbmRpY2F0b3JzKSkNCiAgICAgICAgICAgICAgICkNCg0KZGF0b3NfbW9kZWwgPC0gZGF0b3NfbW9kZWwgJT4lIGFycmFuZ2UoaXNvMmMsIHllYXIpICU+JSANCiAgICAgICAgbXV0YXRlKGhkaV9kaWZmID0gaGRpIC0gZHBseXI6OmxhZyhoZGkpLCANCiAgICAgICAgICAgICAgIE5ZLkdEUC5QQ0FQLkNEX2RpZmYgPSBOWS5HRFAuUENBUC5DRCAtIGRwbHlyOjpsYWcoTlkuR0RQLlBDQVAuQ0QpLA0KICAgICAgICAgICAgICAgRFQuT0RBLkFMTEQuQ0RfZGlmZiA9IERULk9EQS5BTExELkNEIC0gZHBseXI6OmxhZyhEVC5PREEuQUxMRC5DRCksDQogICAgICAgICAgICAgICBEVC5PREEuT0RBVC5QQy5aU19kaWZmID0gRFQuT0RBLk9EQVQuUEMuWlMgLSBkcGx5cjo6bGFnKERULk9EQS5PREFULlBDLlpTKSkgJT4lDQogICAgICAgIGZpbHRlcigheWVhciAlaW4lIGMoMjAwMSkpDQoNCnZpc19kYXQoZGF0b3NfbW9kZWwpDQoNCmBgYA0KDQojIE1vZGVsb3MgUmVncmVzaW9uIExpbmVhbCB7LnRhYnNldCAudGFic2V0LWZhZGV9DQoNClByb2JhbmRvIG1vZGVsb3Mgc2VuY2lsbG9zLCByZWdyZXNpb24gbGluZWFsLCBNaW5pbW9zIGN1YWRyYWRvcywgZGF0b3MgcGFuZWwsIEhESSBvIEdEUCBvIHN1cyBkaWZmZXJlY2lhcw0KDQojIyBIREkgfiBPREEuQUxMDQoNCiMjIyBIREkgPSBPREEuQUxMICsgQ0MgKyBHRSArIFBWICsgUlEgKyBSTCArIFZBICsgUE9QLkdST1cNCg0KYGBge3J9DQpzdW1tYXJ5KGxtKGhkaSB+IERULk9EQS5BTExELkNEICsgQ0MuRVNUICsgR0UuRVNUICsgUFYuRVNUICsgUlEuRVNUICsgUkwuRVNUICsgVkEuRVNUICsgU1AuUE9QLkdST1csIGRhdGE9ZGF0b3NfbW9kZWwpKQ0KIyBUb2RhcyBsYXMgdmFyaWFibGVzIHNvbiBzaWduaWZpY2F0aXZhcyBhbCA5OSUgZXhjZXB0byBSZWd1bGF0b3J5IFF1YWxpdHkNCmBgYA0KDQojIyBIREkgfiBPREEuUEMNCg0KIyMjIEhESSA9IE9EQS5QQyArIENDICsgR0UgKyBQViArIFJRICsgUkwgKyBWQSArIFBPUC5HUk9XDQoNCmBgYHtyfQ0Kc3VtbWFyeShsbShoZGkgfiBEVC5PREEuT0RBVC5QQy5aUyArIENDLkVTVCArIEdFLkVTVCArIFBWLkVTVCArIFJRLkVTVCArIFJMLkVTVCArIFZBLkVTVCArIFNQLlBPUC5HUk9XLCBkYXRhPWRhdG9zX21vZGVsKSkNCiMgVG9kYXMgbGFzIHZhcmlhYmxlcyBzb24gc2lnbmlmaWNhdGl2YXMgYWwgOTklIGV4Y2VwdG8gUmVndWxhdG9yeSBRdWFsaXR5DQpgYGANCg0KIyMgR1BELlBDIH4gT0RBLkFMTA0KDQojIyMgR1BELlBDID0gT0RBLkFMTCArIENDICsgR0UgKyBQViArIFJRICsgUkwgKyBWQSArIFBPUC5HUk9XDQoNCmBgYHtyfQ0Kc3VtbWFyeShsbShOWS5HRFAuUENBUC5DRCB+IERULk9EQS5BTExELkNEICsgQ0MuRVNUICsgR0UuRVNUICsgUFYuRVNUICsgUlEuRVNUICsgUkwuRVNUICsgVkEuRVNUICsgU1AuUE9QLkdST1csIGRhdGE9ZGF0b3NfbW9kZWwpKQ0KIyBUb2RhcyBsYXMgdmFyaWFibGVzIHNvbiBzaWduaWZpY2F0aXZhcyBhbCA5OSUgZXhjZXB0byBPREEuQUxMLCBDb250cm9sIG9mIENvcnJ1cHRpb24sIFJlZ3VsYXRvcnkgUXVhbGl0eSB5IFJ1bGUgb2YgTGF3DQpgYGANCg0KIyMgR1BELlBDIH4gT0RBLlBDDQoNCiMjIyBHUEQuUEMgPSBPREEuUEMgKyBDQyArIEdFICsgUFYgKyBSUSArIFJMICsgVkEgKyBQT1AuR1JPVw0KDQpgYGB7cn0NCnN1bW1hcnkobG0oTlkuR0RQLlBDQVAuQ0QgfiBEVC5PREEuT0RBVC5QQy5aUyArIENDLkVTVCArIEdFLkVTVCArIFBWLkVTVCArIFJRLkVTVCArIFJMLkVTVCArIFZBLkVTVCArIFNQLlBPUC5HUk9XLCBkYXRhPWRhdG9zX21vZGVsKSkNCiMgVG9kYXMgbGFzIHZhcmlhYmxlcyBzb24gc2lnbmlmaWNhdGl2YXMgYWwgOTklIGV4Y2VwdG8gUnVsZSBvZiBMYXcNCmBgYA0KDQojIA0KDQpTZSByZXZpc2FyYSBsYXMgcmVsYWNpb25lcyBlbnRyZSBsYXMgdmFyaWFibGVzIGdyYWZpY2FtZW50ZQ0KDQojIFZpc3VhbGl6YWNpb24gZGUgZGF0b3Mgey50YWJzZXQgLnRhYnNldC1mYWRlfQ0KDQojIyBIREkNCg0KYGBge3J9DQpteV9wbG90ICA8LSBsaXN0KCkNCg0KZm9yIChjb2wgaW4gYygnRFQuT0RBLkFMTEQuQ0QnLCAnRFQuT0RBLk9EQVQuUEMuWlMnLCAnRFQuT0RBLkFMTEQuQ0RfZGlmZicsICdEVC5PREEuT0RBVC5QQy5aU19kaWZmJywgDQogICAgICAgICAgICAgICdDQy5FU1QnLCAnR0UuRVNUJywgJ1BWLkVTVCcsICdSUS5FU1QnLCAnUkwuRVNUJywgJ1ZBLkVTVCcpKSB7DQogIG15X3Bsb3RbW2NvbF1dIDwtIHBsb3RfbHkoeCA9IGRhdG9zX21vZGVsW1tjb2xdXSwgeSA9IGRhdG9zX21vZGVsW1snaGRpJ11dLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLCBuYW1lID0gY29sKSAgDQp9DQpzdWJwbG90KG15X3Bsb3RbMTo0XSwgbnJvd3MgPSAyLCBtYXJnaW4gPSAwLjA1KSAlPiUgbGF5b3V0KHRpdGxlID0gJ0hESSB2cyBPREEnKQ0Kc3VicGxvdChteV9wbG90WzU6MTBdLCBucm93cyA9IDIsIG1hcmdpbiA9IDAuMDUpICU+JSBsYXlvdXQodGl0bGUgPSAnSERJIHZzIEdPQicpDQpgYGANCg0KIyMgSERJIGRpZmYNCg0KYGBge3J9DQpteV9wbG90ICA8LSBsaXN0KCkNCg0KZm9yIChjb2wgaW4gYygnRFQuT0RBLkFMTEQuQ0QnLCAnRFQuT0RBLk9EQVQuUEMuWlMnLCAnRFQuT0RBLkFMTEQuQ0RfZGlmZicsICdEVC5PREEuT0RBVC5QQy5aU19kaWZmJywgDQogICAgICAgICAgICAgICdDQy5FU1QnLCAnR0UuRVNUJywgJ1BWLkVTVCcsICdSUS5FU1QnLCAnUkwuRVNUJywgJ1ZBLkVTVCcpKSB7DQogIG15X3Bsb3RbW2NvbF1dIDwtIHBsb3RfbHkoeCA9IGRhdG9zX21vZGVsW1tjb2xdXSwgeSA9IGRhdG9zX21vZGVsW1snaGRpX2RpZmYnXV0sIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbWFya2VycycsIG5hbWUgPSBjb2wpICANCn0NCnN1YnBsb3QobXlfcGxvdFsxOjRdLCBucm93cyA9IDIsIG1hcmdpbiA9IDAuMDUpICU+JSBsYXlvdXQodGl0bGUgPSAnSERJIGRpZmYgdnMgT0RBJykNCnN1YnBsb3QobXlfcGxvdFs1OjEwXSwgbnJvd3MgPSAyLCBtYXJnaW4gPSAwLjA1KSAlPiUgbGF5b3V0KHRpdGxlID0gJ0hESSBkaWZmIHZzIEdPQicpDQpgYGANCg0KIyMgR1BELlBDDQoNCmBgYHtyfQ0KbXlfcGxvdCAgPC0gbGlzdCgpDQpmb3IgKGNvbCBpbiBjKCdEVC5PREEuQUxMRC5DRCcsICdEVC5PREEuT0RBVC5QQy5aUycsICdEVC5PREEuQUxMRC5DRF9kaWZmJywgJ0RULk9EQS5PREFULlBDLlpTX2RpZmYnLCANCiAgICAgICAgICAgICAgJ0NDLkVTVCcsICdHRS5FU1QnLCAnUFYuRVNUJywgJ1JRLkVTVCcsICdSTC5FU1QnLCAnVkEuRVNUJykpIHsNCiAgbXlfcGxvdFtbY29sXV0gPC0gcGxvdF9seSh4ID0gZGF0b3NfbW9kZWxbW2NvbF1dLCB5ID0gZGF0b3NfbW9kZWxbWydOWS5HRFAuUENBUC5DRCddXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdtYXJrZXJzJywgbmFtZSA9IGNvbCkgIA0KfQ0Kc3VicGxvdChteV9wbG90WzE6NF0sIG5yb3dzID0gMiwgbWFyZ2luID0gMC4wNSkgJT4lIGxheW91dCh0aXRsZSA9ICdHRFAuUEMgdnMgT0RBJykNCnN1YnBsb3QobXlfcGxvdFs1OjEwXSwgbnJvd3MgPSAyLCBtYXJnaW4gPSAwLjA1KSAlPiUgbGF5b3V0KHRpdGxlID0gJ0dEUC5QQyB2cyBHT0InKQ0KDQpgYGANCg0KIyMgR1BELlBDIGRpZmYNCg0KYGBge3J9DQpteV9wbG90ICA8LSBsaXN0KCkNCmZvciAoY29sIGluIGMoJ0RULk9EQS5BTExELkNEJywgJ0RULk9EQS5PREFULlBDLlpTJywgJ0RULk9EQS5BTExELkNEX2RpZmYnLCAnRFQuT0RBLk9EQVQuUEMuWlNfZGlmZicsIA0KICAgICAgICAgICAgICAnQ0MuRVNUJywgJ0dFLkVTVCcsICdQVi5FU1QnLCAnUlEuRVNUJywgJ1JMLkVTVCcsICdWQS5FU1QnKSkgew0KICBteV9wbG90W1tjb2xdXSA8LSBwbG90X2x5KHggPSBkYXRvc19tb2RlbFtbY29sXV0sIHkgPSBkYXRvc19tb2RlbFtbJ05ZLkdEUC5QQ0FQLkNEX2RpZmYnXV0sIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbWFya2VycycsIG5hbWUgPSBjb2wpICANCn0NCnN1YnBsb3QobXlfcGxvdFsxOjRdLCBucm93cyA9IDIsIG1hcmdpbiA9IDAuMDUpICU+JSBsYXlvdXQodGl0bGUgPSAnR0RQLlBDIGRpZmYgdnMgT0RBJykNCnN1YnBsb3QobXlfcGxvdFs1OjEwXSwgbnJvd3MgPSAyLCBtYXJnaW4gPSAwLjA1KSAlPiUgbGF5b3V0KHRpdGxlID0gJ0dEUC5QQyBkaWZmIHZzIEdPQicpDQoNCmBgYA0KDQojIA0KDQpObyBzZSB2ZSB1bmEgcmVsYWNpb24gY2xhcmEsIGhheSB0YW50byBwYWlzZXMgY29uIHB1bnRlb3MgYWx0b3MgeSBiYWpvcyBkZSBHT0IgcXVlIHRpZW5lbiB0YW50byBISUQgYWx0b3MgbyBiYWpvcyBRdWl6YSBwdWVkZSB2ZXJzZSB1bmEgbGV2ZSByZWxhY2lvbiBkZSBtYXlvciBwdW50ZW8gZW4gR09CIGFjb21wYcOxYWRvIGRlIG1lam9yIHB1bnRlbyBkZW4gSERJIExvcyBkYXRvcyBkZSBHUEQgc2kgbXVlc3RyYW4gdW5hIHJlbGFjaW9uIHBvc2l0aXZhIGNvbiBlbCBIREkgdmlzdG8gZW4gbGFzIGdyYWZpY2FzDQoNClNlIHJlYWxpemFyYSBlbCBtaXNtbyBwcm9jZXNvIGNvbiBlbCBjcmVjaW1pZW50byBvIGRlY3JlY2ltaWVudG8gZGUgSERJIGFudWFsDQoNCiMgVmlzdWFsaXphY2lvbiBkZSBEYXRvcyBoaXN0b3JpYQ0KDQpWaWVuZG8gbGEgaGlzdG9yaWEgZGUgbGFzIHZhcmlhYmxlcyBlbiBlbCB0aWVtcG8gKHBvciBwYWlzKQ0KDQpgYGB7cn0NCmRhdG9zX21vZGVsICU+JSBmaWx0ZXIoaXNvMmMgPT0gJ0FGJykgJT4lIHBsb3RfbHkoeCA9IH55ZWFyKSAlPiUgDQogIGFkZF90cmFjZSh5ID0gfmhkaSwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcyttYXJrZXJzJywgbmFtZSA9ICdoZGknKSAlPiUgDQogIGFkZF90cmFjZSh5ID0gfk5ZLkdEUC5QQ0FQLkNEIC8gMTAwMCwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcyttYXJrZXJzJywgbmFtZSA9ICdnZHAucGMnKSAlPiUgDQogIGFkZF90cmFjZSh5ID0gfkRULk9EQS5BTExELkNEIC8gMTAwMDAwMDAwMDAsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMrbWFya2VycycsIG5hbWUgPSAnT0RBLkFMTCcpICAlPiUgDQogIGFkZF90cmFjZSh5ID0gfkRULk9EQS5PREFULlBDLlpTIC8gMTAwMCwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcyttYXJrZXJzJywgbmFtZSA9ICdPREEuUEMnKSAgJT4lIA0KICBhZGRfdHJhY2UoeSA9IH5DQy5FU1QsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMrbWFya2VycycsIG5hbWUgPSAnQ0MnKSAlPiUgDQogIGFkZF90cmFjZSh5ID0gfkdFLkVTVCwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcyttYXJrZXJzJywgbmFtZSA9ICdHRScpICAlPiUgDQogIGFkZF90cmFjZSh5ID0gflBWLkVTVCwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcyttYXJrZXJzJywgbmFtZSA9ICdQVicpICAlPiUgDQogIGFkZF90cmFjZSh5ID0gflJRLkVTVCwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcyttYXJrZXJzJywgbmFtZSA9ICdSUScpICAlPiUgDQogIGFkZF90cmFjZSh5ID0gflJMLkVTVCwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcyttYXJrZXJzJywgbmFtZSA9ICdSTCcpICAlPiUgDQogIGFkZF90cmFjZSh5ID0gflZBLkVTVCwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcyttYXJrZXJzJywgbmFtZSA9ICdWQScpDQpgYGANCg0KIyBNb2RlbG9zIEVmZWN0b3MgZmlqb3Mgey50YWJzZXQgLnRhYnNldC1mYWRlfQ0KDQojIyBIREkgfiBPREEuQUxMDQoNCmBgYHtyfQ0KcGxtKGhkaSB+IERULk9EQS5BTExELkNEICsgQ0MuRVNUICsgR0UuRVNUICsgUFYuRVNUICsgUlEuRVNUICsgUkwuRVNUICsgVkEuRVNUICsgU1AuUE9QLkdST1csIGRhdGE9ZGF0b3NfbW9kZWwsDQogICAgaW5kZXggPSBjKCJpc28yYyIsICJ5ZWFyIiksIG1vZGVsID0gIndpdGhpbiIpDQoNCiMgc3VtbWFyeShsbShoZGkgfiBEVC5PREEuQUxMRC5DRCArIENDLkVTVCArIEdFLkVTVCArIFBWLkVTVCArIFJRLkVTVCArIFJMLkVTVCArIFZBLkVTVCArIFNQLlBPUC5HUk9XICsgaXNvMmMsIGRhdGE9ZGF0b3NfbW9kZWwpKQ0KIyBDb3JydXB0aW9uIENvbnRyb2wsIEdvdmVybm1lbnQgRWZmZWN0aXZlbmVzcywgUG9saXRpY2FsIFN0YWJpbGl0eSB5IFZvaWNlIGFuZCBBY2NvdW50YWJpbGl0eSBubyBzb24gc2lnbmlmaWNhdGl2YXMNCmBgYA0KIyMNCg0KIyMgSERJIH4gT0RBLlBDDQoNCmBgYHtyfQ0KcGxtKGhkaSB+IERULk9EQS5PREFULlBDLlpTICsgQ0MuRVNUICsgR0UuRVNUICsgUFYuRVNUICsgUlEuRVNUICsgUkwuRVNUICsgVkEuRVNUICsgU1AuUE9QLkdST1csIGRhdGE9ZGF0b3NfbW9kZWwsDQogICAgaW5kZXggPSBjKCJpc28yYyIsICJ5ZWFyIiksIG1vZGVsID0gIndpdGhpbiIpDQoNCiNzdW1tYXJ5KGxtKGhkaSB+IERULk9EQS5PREFULlBDLlpTICsgQ0MuRVNUICsgR0UuRVNUICsgUFYuRVNUICsgUlEuRVNUICsgUkwuRVNUICsgVkEuRVNUICsgU1AuUE9QLkdST1cgKyBpc28yYywgZGF0YT1kYXRvc19tb2RlbCkpDQojIENvcnJ1cHRpb24gQ29udHJvbCwgR292ZXJubWVudCBFZmZlY3RpdmVuZXNzIHkgVm9pY2UgYW5kIEFjY291bnRhYmlsaXR5IG5vIHNvbiBzaWduaWZpY2F0aXZhcw0KYGBgDQojIw0KDQojIyBHRFAuUEMgfiBPREEuQUxMDQoNCmBgYHtyfQ0KcGxtKE5ZLkdEUC5QQ0FQLkNEIH4gRFQuT0RBLkFMTEQuQ0QgKyBDQy5FU1QgKyBHRS5FU1QgKyBQVi5FU1QgKyBSUS5FU1QgKyBSTC5FU1QgKyBWQS5FU1QgKyBTUC5QT1AuR1JPVywgZGF0YT1kYXRvc19tb2RlbCwNCiAgICBpbmRleCA9IGMoImlzbzJjIiwgInllYXIiKSwgbW9kZWwgPSAid2l0aGluIikNCg0KI3N1bW1hcnkobG0oTlkuR0RQLlBDQVAuQ0QgfiBEVC5PREEuQUxMRC5DRCArIENDLkVTVCArIEdFLkVTVCArIFBWLkVTVCArIFJRLkVTVCArIFJMLkVTVCArIFZBLkVTVCArIFNQLlBPUC5HUk9XICsgaXNvMmMsIGRhdGE9ZGF0b3NfbW9kZWwpKQ0KIyBJbnRlcmNlcHRvLCBDb3JydXB0aW9uIENvbnRyb2wsIFJlZ3VsYXRvcnkgUXVhbGl0eSwgUnVsZSBvZiBMYXcsIFZvaWNlIGFuZCBBY2NvdW50YWJpbGl0eSB5IFBvcHVsYXRpb24gR3Jvd3RoIG5vIHNvbiBzaWduaWZpY2F0aXZhcw0KYGBgDQojIw0KDQojIyBHRFAuUEMgfiBPREEuUEMNCg0KYGBge3J9DQpwbG0oTlkuR0RQLlBDQVAuQ0QgfiBEVC5PREEuT0RBVC5QQy5aUyArIENDLkVTVCArIEdFLkVTVCArIFBWLkVTVCArIFJRLkVTVCArIFJMLkVTVCArIFZBLkVTVCArIFNQLlBPUC5HUk9XLCBkYXRhPWRhdG9zX21vZGVsLA0KICAgIGluZGV4ID0gYygiaXNvMmMiLCAieWVhciIpLCBtb2RlbCA9ICJ3aXRoaW4iKQ0KDQojc3VtbWFyeShsbShOWS5HRFAuUENBUC5DRCB+IERULk9EQS5PREFULlBDLlpTICsgQ0MuRVNUICsgR0UuRVNUICsgUFYuRVNUICsgUlEuRVNUICsgUkwuRVNUICsgVkEuRVNUICsgU1AuUE9QLkdST1cgKyBpc28yYywgZGF0YT1kYXRvc19tb2RlbCkpDQojIENvcnJ1cHRpb24gQ29udHJvbCwgUmVndWxhdG9yeSBRdWFsaXR5LCBSdWxlIG9mIExhdyB5IFZvaWNlIGFuZCBBY2NvdW50YWJpbGl0eSBubyBzb24gc2lnbmlmaWNhdGl2YXMNCmBgYA0KIyMNCg0K